/**
 *
 *  plugin_KeyManagerPlugin.h
 *
 */

#pragma once

#include <drogon/plugins/Plugin.h>
#include <cryptopp/rsa.h>
#include <cryptopp/files.h>
#include <cryptopp/osrng.h>
#include <cryptopp/base64.h>

/**
     * 密钥管理插件
     */
class KeyManagerPlugin : public drogon::Plugin<KeyManagerPlugin> {
public:
    /**
     * 构造函数
     */
    KeyManagerPlugin();

    /**
     * 初始化并启动插件
     * @param config 配置文件参数
     */
    void initAndStart(const Json::Value &config) override;

    /**
     * 关闭插件
     */
    void shutdown() override;

    /**
     * RSA加密方法
     * @param str 明文字符串
     * @return 加密后的字符串
     */
    [[maybe_unused]] std::string rsaEncrypt(const std::string &str);

    /**
     * RSA解密方法
     * @param str 加密后的字符串
     * @erturn 明文字符串
     */
    [[maybe_unused]] std::string rsaDecrypt(const std::string &str);

private:
    // RSA私钥
    CryptoPP::RSA::PrivateKey privateKey;

    // RSA公钥
    CryptoPP::RSA::PublicKey publicKey;

    /**
     * 加载密钥
     * @param keyPath 密钥路径
     * @param isPrivateKey 是否私钥
     */
    void loadKey(const std::string &keyPath, bool isPrivateKey);
};